package br.com.conciliador.cadastro.negocio;

import java.util.HashMap;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Order;

import br.com.conciliador.cadastro.vo.LancamentosVo;
import br.com.conciliador.util.hibernate.business.R2HbNgc;
import br.com.r2.util.hibernate.business.RestritorHb;

public class LancamentosNgc extends R2HbNgc<LancamentosVo>
{

   private Map filtroPropriedade = new HashMap();
   private Map restritores = new HashMap();
   
   private static LancamentosNgc instancia = null;
   
   public static final int JOIN_BANDEIRA = 1;

   public static final int JOIN_LOJA = 2;

   public static final int JOIN_DATACREDITO = 4;

   public static final int JOIN_DATALANCAMENTO = 8;

   public static final int JOIN_HISTORICO = 16;

   public static final int JOIN_NATUREZA = 64;

   public static final int JOIN_ARQUIVO = 128;

   public static final int JOIN_CHAVEFATO = 256;

   public static final int JOIN_CHAVELANCAMENTO = 512;

   private LancamentosNgc()
   {
      init(restritores, filtroPropriedade, LancamentosVo.class);
      addFiltro("bandeira.codigo", RestritorHb.RESTRITOR_EQ, "bandeiraVo.codigo");
      addFiltro("estLoja.codigo", RestritorHb.RESTRITOR_EQ, "filtroVo.estLoja");
      addFiltro("dataLancamento.data", RestritorHb.RESTRITOR_DATA_INICIAL, "filtro.dataLancamentoInicial");
      addFiltro("dataLancamento.data", RestritorHb.RESTRITOR_DATA_FINAL, "filtro.dataLancamentoFinal");
      addFiltro("historico.codigo", RestritorHb.RESTRITOR_EQ, "historicoVo.codigo");
      addFiltro("historico.tipo", RestritorHb.RESTRITOR_EQ, "historicoVo.tipo");
   }

   public static LancamentosNgc getInstancia()
   {
       if (instancia == null)
       {
           instancia = new LancamentosNgc();
       }
       return instancia;
   }

   @Override
   protected Map filtroPropriedade()
   {
       return filtroPropriedade;
   }

   @Override
   protected Criteria montaCriteria(Session sessao, int join)
   {
       Criteria criteria = sessao.createCriteria(LancamentosVo.class);
       
       if ((join & JOIN_BANDEIRA) != 0)
       {
          criteria.createCriteria("bandeiraVo", "bandeira", Criteria.INNER_JOIN);
       }
       if ((join & JOIN_LOJA) != 0)
       {
          criteria.createCriteria("lojaVo", "loja", Criteria.INNER_JOIN);
          criteria.createCriteria("loja.estLojaVo", "estLoja", Criteria.INNER_JOIN);
       }
       if ((join & JOIN_DATACREDITO) != 0)
       {
          criteria.createCriteria("dataCreditoVo", "dataCredito", Criteria.INNER_JOIN);
       }
       if ((join & JOIN_DATALANCAMENTO) != 0)
       {
          criteria.createCriteria("dataLancamentoVo", "dataLancamento", Criteria.INNER_JOIN);
       }
       if ((join & JOIN_NATUREZA) != 0)
       {
          criteria.createCriteria("naturezaVo", "natureza", Criteria.LEFT_JOIN);
       }
       if ((join & JOIN_CHAVEFATO) != 0)
       {
          criteria.createCriteria("chaveFatoVo", "chaveFato", Criteria.LEFT_JOIN);
       }
       if ((join & JOIN_CHAVELANCAMENTO) != 0)
       {
          criteria.createCriteria("chaveLancamentosVo", "chaveLancamentos", Criteria.LEFT_JOIN);
       }
       if ((join & JOIN_HISTORICO) != 0)
       {
          criteria.createCriteria("historicoVo", "historico", Criteria.LEFT_JOIN);
       }
       if ((join & JOIN_ARQUIVO) != 0)
       {
          criteria.createCriteria("arquivoVo", "arquivo", Criteria.LEFT_JOIN);
       }

       return criteria;
   }

   @Override
   protected Map restritores()
   {
       return restritores;
   }
   
   @Override
   protected void setarOrdenacao(Criteria criteria, LancamentosVo filter, int join)
   {
      if ((join & JOIN_DATALANCAMENTO) != 0)
      {
         criteria.addOrder(Order.asc("dataLancamento.data"));
      }         
      if ((join & JOIN_LOJA) != 0)
      {
         criteria.addOrder(Order.asc("loja.descricao"));
      }         
      if ((join & JOIN_BANDEIRA) != 0)
      {
         criteria.addOrder(Order.asc("bandeira.descricao"));
      }         
      //criteria.addOrder(Order.asc("data"));
   }
   
}
